/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.*;
import br.jm.acionista.filter.Funcoes;
import br.jm.acionista.sistema.eao.ClienteEao;
import br.jm.acionista.sistema.eao.EmpresaEao;
import br.jm.acionista.sistema.eao.LivroEao;
import br.jm.acionista.sistema.eao.SubscricaoEao;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class SubscricaoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Subscricao selectedSubscricao;
    private LazyDataModel<Subscricao> lazyModel;
    private SubscricaoEao subscricaoJpa;
    private ClienteEao clienteJpa;
    private LivroEao livroJpa;
    private Funcoes funcoes = new Funcoes();
    private Anotacao selectedAnotacao;
    private Cliente SelectedCliente;
    private Livro selectedLivro;
    private EntityManager sessao;
    private Cliente clienteTemp;
    private Subscricao SubscricaoTemp;
    private Empresa selectedEmpresa;
    private EmpresaEao empresaJpa;
    private String cSql;
    private String cPagina;

    public SubscricaoBean() {
        subscricaoJpa = SubscricaoEao.getInstance();
        clienteJpa = ClienteEao.getInstance();
        livroJpa = LivroEao.getInstance();
        empresaJpa = EmpresaEao.getInstance();

        selectedSubscricao = novo();
        selectedAnotacao = new Anotacao();
        SelectedCliente = new Cliente();
        selectedLivro = new Livro();
        clienteTemp = new Cliente();
        SubscricaoTemp = new Subscricao();

        try {
            this.lazyModel = new LazyDataModel<Subscricao>() {

                @Override
                public List<Subscricao> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
                    List<Subscricao> data = new ArrayList<Subscricao>();

                    if (selectedSubscricao.getIdCliente() != null) {
                        filters.put("idCliente", selectedSubscricao.getIdCliente().getIdCliente().toString());
                    } else {
                        filters.put("idCliente", "0");
                    }
                    try {
                        data = subscricaoJpa.getNative("Subscricao", first, pageSize, sortField, sortOrder, filters, null);
                        this.setPageSize(pageSize);
                    } catch (Exception ex) {
                        Logger.getLogger(SubscricaoBean.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    return data;
                }
            };
            this.lazyModel.setRowCount(subscricaoJpa.getCount("Subscricao"));
        } catch (Exception ex) {
            Logger.getLogger(SubscricaoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void inserir(ActionEvent actionEvent) throws EaoException {
        FacesMessage msg = null;

        try {
            this.sessao = subscricaoJpa.openSessaoLote();
            subscricaoJpa.openTransaction(this.sessao);

            selectedSubscricao.setIdSubscricao(null);
            carregaDados();
            subscricaoJpa.create(selectedSubscricao, "S", this.sessao);

            // Atualiza o saldo atual do Cessionario
            clienteTemp = new Cliente();
            clienteTemp = clienteJpa.getPorId(selectedSubscricao.getIdCliente().getIdCliente(), "S", this.sessao);
            clienteTemp.setQdeAcao(clienteTemp.getQdeAcao().add(selectedSubscricao.getQdeSubscrita()));
            clienteJpa.edit(clienteTemp, "S", this.sessao);

            subscricaoJpa.closeTransaction(this.sessao);
            
            // Atualiza os percetuais de participacao
            selectedEmpresa = empresaJpa.getPorId(1);
            cSql = "update cliente "
                    + "set perc_partic = (qde_acao / ".concat(selectedEmpresa.getQdeTotal().toString()).concat(" ) * 100 ");
            clienteJpa.executeUpdate(cSql);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Subscricao Inserido com Sucesso", "");

        } catch (Exception e) {
            if (this.sessao.isOpen()) {
                subscricaoJpa.closeSessaoRollback(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir", e.getMessage());
        } finally {
            this.sessao = null;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) throws EaoException {
        FacesMessage msg = null;

        try {
            this.sessao = subscricaoJpa.openSessaoLote();
            subscricaoJpa.openTransaction(this.sessao);

            SubscricaoTemp = new Subscricao();
            SubscricaoTemp = subscricaoJpa.getPorId(selectedSubscricao.getIdSubscricao());

            // Atualiza o saldo atual do Cessionario - Retira a qde. anterior
            clienteTemp = new Cliente();
            clienteTemp = clienteJpa.getPorId(SubscricaoTemp.getIdCliente().getIdCliente(), "S", this.sessao);
            clienteTemp.setQdeAcao(clienteTemp.getQdeAcao().subtract(SubscricaoTemp.getQdeSubscrita()));
            clienteJpa.edit(clienteTemp, "S", this.sessao);

            subscricaoJpa.edit(selectedSubscricao, "S", this.sessao);

            clienteTemp.setQdeAcao(clienteTemp.getQdeAcao().add(selectedSubscricao.getQdeSubscrita()));
            clienteJpa.edit(clienteTemp, "S", this.sessao);

            subscricaoJpa.closeTransaction(this.sessao);

            // Atualiza os percetuais de participacao
            selectedEmpresa = empresaJpa.getPorId(1);
            cSql = "update cliente "
                    + "set perc_partic = (qde_acao / ".concat(selectedEmpresa.getQdeTotal().toString()).concat(" ) * 100 ");
            clienteJpa.executeUpdate(cSql);
            
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Subscricao Alterado com Sucesso", "");
        } catch (Exception e) {
            if (this.sessao.isOpen()) {
                subscricaoJpa.closeSessaoRollback(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: ", e.getMessage());
        } finally {
            this.sessao = null;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) throws EaoException {
        FacesMessage msg = null;

        try {
            this.sessao = subscricaoJpa.openSessaoLote();
            subscricaoJpa.openTransaction(this.sessao);

            // Atualiza o saldo atual do Cessionario - Retira a qde. anterior
            clienteTemp = new Cliente();
            clienteTemp = clienteJpa.getPorId(selectedSubscricao.getIdCliente().getIdCliente(), "S", this.sessao);
            clienteTemp.setQdeAcao(clienteTemp.getQdeAcao().subtract(selectedSubscricao.getQdeSubscrita()));
            clienteJpa.edit(clienteTemp, "S", this.sessao);

            subscricaoJpa.destroy(selectedSubscricao, "S", this.sessao);

            subscricaoJpa.closeTransaction(this.sessao);
            
            // Atualiza os percetuais de participacao
            selectedEmpresa = empresaJpa.getPorId(1);
            cSql = "update cliente "
                    + "set perc_partic = (qde_acao / ".concat(selectedEmpresa.getQdeTotal().toString()).concat(" ) * 100 ");

            clienteJpa.executeUpdate(cSql);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Subscricao Excluido com Sucesso", "");
        } catch (Exception e) {
            if (this.sessao.isOpen()) {
                subscricaoJpa.closeSessaoRollback(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: ", e.getMessage());
        } finally {
            this.sessao = null;
            //atualizaSubscricao();
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public Subscricao novo() {
        this.selectedLivro = new Livro();
        this.selectedSubscricao = new Subscricao();

        this.selectedSubscricao.setDatSubscricao(new Date());
        this.selectedSubscricao.setIdAnotacao(null);
        this.selectedSubscricao.setIdCliente(null);
        this.selectedSubscricao.setIdLivro(this.selectedLivro.getIdLivro());
        this.selectedSubscricao.setQdeSubscrita(BigDecimal.ZERO);
        this.selectedSubscricao.setVlrRealizado(BigDecimal.ZERO);
        this.selectedSubscricao.setVlrRealizar(BigDecimal.ZERO);

        return this.selectedSubscricao;
    }

    public LazyDataModel<Subscricao> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<Subscricao> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public Subscricao getSelectedSubscricao() {
        if (this.selectedSubscricao == null) {
            this.selectedSubscricao = novo();
        }
        return selectedSubscricao;
    }

    public void setSelectedSubscricao(Subscricao selectedSubscricao) {
        if (selectedSubscricao.getIdLivro() != null) {
            try {
                selectedLivro = livroJpa.getPorId(selectedSubscricao.getIdLivro());
            } catch (EaoException ex) {
                Logger.getLogger(SubscricaoBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        this.selectedSubscricao = selectedSubscricao;
    }

    public void onSelectRow(SelectEvent event) throws EaoException {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        int nIdCliente = Integer.parseInt(map.get("idCliente"));
        clienteTemp = clienteJpa.getPorId(nIdCliente);

        selectedAnotacao = new Anotacao();
        selectedAnotacao = (Anotacao) event.getObject();

        if (this.selectedSubscricao == null) {
            this.selectedSubscricao = novo();
        }

        this.selectedSubscricao.setIdAnotacao(selectedAnotacao);
        this.selectedSubscricao.setIdCliente(clienteTemp);

        this.selectedSubscricao.setIdAnotacao(selectedAnotacao);
    }

    public void onSelectRowCliente(SelectEvent event) throws EaoException {
        if (SelectedCliente == null || SelectedCliente.getIdCliente() == null) {
            SelectedCliente = new Cliente();
            SelectedCliente = (Cliente) event.getObject();
        }

        this.selectedSubscricao = novo();

        this.selectedSubscricao.setIdCliente(SelectedCliente);
    }

    public void onSelectRowLivro(SelectEvent event) throws EaoException {
        if (selectedLivro == null || selectedLivro.getIdLivro() == null) {
            selectedLivro = new Livro();
        }
        selectedLivro = (Livro) event.getObject();
        this.selectedSubscricao.setIdLivro(selectedLivro.getIdLivro());
    }

    public void carregaDados() throws EaoException {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        String cDatSubscricao = map.get("inDatSubscricao_input");
        String cQdeSubscrita = map.get("qdeSubscrita");
        String cVlrRealizado = map.get("vlrRealizado");
        String cVlrRealizar = map.get("vlrRealizar");

        this.selectedSubscricao.setDatSubscricao(funcoes.ConverteData(cDatSubscricao));
        this.selectedSubscricao.setQdeSubscrita(funcoes.criaBigDecimal(cQdeSubscrita));
        this.selectedSubscricao.setVlrRealizado(funcoes.criaBigDecimal(cVlrRealizado));
        this.selectedSubscricao.setVlrRealizar(funcoes.criaBigDecimal(cVlrRealizar));

        cSql = "select id_livro,dat_abertura,dat_fechamento,num_folha_final,num_folha_inic,num_livro "
                + "from livro "
                + "where dat_fechamento is null";
        this.selectedLivro = livroJpa.getNativeFiltro(cSql);
        this.selectedSubscricao.setIdLivro(this.selectedLivro.getIdLivro());
    }

    public Anotacao getSelectedAnotacao() {
        return selectedAnotacao;
    }

    public void setSelectedAnotacao(Anotacao selectedAnotacao) {
        this.selectedAnotacao = selectedAnotacao;
    }

    public Cliente getSelectedCliente() {
        return SelectedCliente;
    }

    public void setSelectedCliente(Cliente SelectedCliente) {
        this.SelectedCliente = SelectedCliente;
    }

    public Livro getSelectedLivro() {
        return selectedLivro;
    }

    public void setSelectedLivro(Livro selectedLivro) {
        this.selectedLivro = selectedLivro;
    }
}
